package gerencia;

import java.io.FileNotFoundException;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import persistencia.GerenciadorEventos;

import descricoes.*;

/**
 * Classe que gerencia os eventos(adiciona,remove e localiza)
 * 
 * @author Grupo 3
 * 
 */
public class GrEventos {

	private GerenciadorEventos eventos;

	/**
	 * Construtor default da classe GrEventos
	 * 
	 * @throws FileNotFoundException
	 *             Caso o arquivo nao seja achado
	 */
	public GrEventos() throws Exception {
		this.eventos = GerenciadorEventos.getInstance();

	}

	/**
	 * Metodo que adiciona um evento ao banco de dados (sem o parametro
	 * repeticoes)
	 * 
	 * @param id
	 *            O ID do evento
	 * @param nome
	 *            O nome do evento
	 * @param inicio
	 *            A data de inicio do evento
	 * @param fim
	 *            A data de fim do evento
	 * @param area
	 *            A area do evento
	 * @param contato
	 *            Um nome para contato
	 * @throws Exception
	 *             Se ja houver um evento com a mesma identificacao ou algum dos
	 *             parametros seja invalido
	 */
	public void adicionaEvento(String id, String nome, String inicio,
			String fim, String area, String contato) throws Exception {
		this.adicionaEvento(id, nome, inicio, fim, area, contato, 0);
	}

	/**
	 * Metodo que adiciona um evento ao banco de dados
	 * 
	 * @param id
	 *            O ID do evento
	 * @param nome
	 *            O nome do evento
	 * @param inicio
	 *            A data de inicio do evento
	 * @param fim
	 *            A data de fim do evento
	 * @param area
	 *            A area do evento
	 * @param contato
	 *            Um nome para contato
	 * @param repeticoes
	 *            O numero de repeticoes do evento
	 * @throws Exception
	 *             Se ja houver um evento com a mesma identificacao ou algum dos
	 *             parametros seja invalido
	 */
	public void adicionaEvento(String id, String nome, String inicio,
			String fim, String area, String contato, int repeticoes)
			throws Exception {
		if (localizaEventoID(id) != null) {
			throw new Exception("Ja existe evento com esta identificacao.");
		} else {
			Evento evento = new Evento(id, nome, inicio, fim, area, contato,
					repeticoes);
			getEventos().adicionaObjeto(evento);

		}

	}

	/**
	 * Localiza um evento adicionado pela identificacao
	 * 
	 * @param id
	 *            A ID do evento
	 * @return O evento, caso seja encontrado || null, caso contrario
	 */
	public Evento localizaEventoID(String id) {
		Iterator<Evento> it = getEventos().carregarDados().iterator();
		while (it.hasNext()) {
			Evento evento = it.next();
			if (evento.getId().equals(id)) {
				return evento;
			}
		}
		return null;
	}

	/**
	 * Remove um evento do banco de dados
	 * 
	 * @param idEvento
	 *            A ID do evento
	 */
	public void cancelaEvento(String idEvento) {
		Evento evento = localizaEventoID(idEvento);
		if (!(evento == null)) {
			getEventos().removeObjeto(evento);
		}
	}

	/**
	 * Retorna um atributo de um evento
	 * 
	 * @param id
	 *            A identificacao do evento
	 * @param atributo
	 *            O atributo do evento
	 * @return Uma string representando o atributo desejado
	 * @throws Exception
	 *             Caso o atributo ou o evento nao exista
	 */
	public String getAtributoEvento(String id, String atributo)
			throws Exception {
		List<String> atributosEvento = new ArrayList<String>();
		atributosEvento.add("id");
		atributosEvento.add("nome");
		atributosEvento.add("inicio");
		atributosEvento.add("fim");
		atributosEvento.add("area");
		atributosEvento.add("contato");
		atributosEvento.add("repeticoes");
		if (!atributosEvento.contains(atributo)) {
			throw new Exception("Atributo nao existe.");
		}
		Evento evento = localizaEventoID(id);
		if (evento == null) {
			throw new Exception("Evento nao existe.");
		}
		switch (atributo.charAt(1)) {
		case 'd':
			return evento.getId();
		case 'o':
			if (atributo.equals("nome")) {
				return evento.getNome();
			} else {
				return evento.getContato();
			}
		case 'n':
			return evento.getInicio();
		case 'i':
			return evento.getFim();
		case 'r':
			return evento.getArea();
		case 'e':
			return String.valueOf(evento.getRepeticoes());

		}
		throw new Exception("Evento nao existe.");
	}

	/**
	 * Recupera o gerenciador de eventos
	 * 
	 * @return O gerenciador de eventos
	 */
	private GerenciadorEventos getEventos() {
		return eventos;
	}

}
